package com.cencat.common.config;

import com.github.pagehelper.PageInterceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Configuration;

import jakarta.annotation.PostConstruct;
import java.util.List;
import java.util.Properties;

/**
 * PageHelper分页插件配置类
 * 提供统一的分页配置和参数设置
 * 
 * @author cencat
 * @since 2024-01-01
 */
@Configuration
@ConditionalOnClass({PageInterceptor.class, SqlSessionFactory.class})
public class PageHelperConfig {

    @Autowired
    private List<SqlSessionFactory> sqlSessionFactoryList;

    /**
     * 配置PageHelper分页插件
     */
    @PostConstruct
    public void addPageInterceptor() {
        PageInterceptor interceptor = new PageInterceptor();
        Properties properties = new Properties();
        
        // 数据库方言，自动检测数据库类型
        properties.setProperty("helperDialect", "mysql");
        
        // 启用合理化，如果pageNum<=0会查询第一页，如果pageNum>总页数会查询最后一页
        properties.setProperty("reasonable", "true");
        
        // 支持通过Mapper接口参数来传递分页参数
        properties.setProperty("supportMethodsArguments", "true");
        
        // 分页参数合理化，默认false禁用
        // 启用合理化时，如果pageNum<1会查询第一页，如果pageNum>pages会查询最后一页
        properties.setProperty("reasonable", "true");
        
        // 为了支持startPage(Object params)方法，增加了该参数来配置参数映射，用于从对象中根据属性名取值
        properties.setProperty("params", "count=countSql");
        
        // 自动识别数据库类型
        properties.setProperty("autoRuntimeDialect", "true");
        
        // 关闭count查询的合理化，禁用合理化时，如果pageNum<1或pageNum>pages会返回空数据
        properties.setProperty("pageSizeZero", "true");
        
        interceptor.setProperties(properties);
        
        // 为所有的SqlSessionFactory添加分页插件
        for (SqlSessionFactory sqlSessionFactory : sqlSessionFactoryList) {
            sqlSessionFactory.getConfiguration().addInterceptor(interceptor);
        }
    }
}